;;; init-lsp.el --- configuration for lsp mode -*- lexical-binding: t -*-
;;; Commentary:
;;; Code:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; lsp-mode
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(setq lsp-log-io nil)
(setq lsp-print-io nil)
(setq lsp-log-max 2000)
(setq lsp-auto-guess-root nil)
(setq lsp-auto-configure nil)
(setq lsp-before-save-edits nil)
(setq lsp-modeline-code-actions-enable nil)
(setq lsp-modeline-diagnostics-enable nil)
(setq lsp-modeline-code-actions-segments '(count))
(setq lsp-headerline-breadcrumbn-enable nil)
(setq lsp-keymap-prefix "M-l")
(setq lsp-signature-function #'lsp-signature-posframe)
(setq lsp-completion-provider :none)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; lsp-completion
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(add-hook 'lsp-configure-hook #'lsp-completion--enable)

(with-eval-after-load 'lsp-completion
  (add-hook 'lsp-completion-mode-hook 'my/lsp-mode-setup-completion)

  (defun my/orderless-dispatch-flex-first (_pattern index _total)
    (and (eq index 0) 'orderless-flex))

  (defun my/lsp-mode-setup-completion ()
    (setf (alist-get 'styles (alist-get 'lsp-capf completion-category-defaults))
          '(orderless)))

  ;; Optionally configure the first word as flex filtered.
  (add-hook 'orderless-style-dispatchers #'my/orderless-dispatch-flex-first nil 'local))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; lsp-diagnostics
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(setq lsp-diagnostics-provider :flycheck)


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; lsp-ui
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; (with-eval-after-load 'lsp-ui
;;   (setq lsp-ui-doc-enable nil)
;;   (setq lsp-ui-imenu-enable nil)
;;   (setq lsp-ui-peek-enable nil)
;;   (setq lsp-ui-sideline-enable nil))


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; lsp-treemacs
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(with-eval-after-load 'lsp-treemacs
  (dolist (buffer-name (list lsp-treemacs-symbols-buffer-name
                             lsp-treemacs-errors-buffer-name
                             lsp-treemacs-deps-buffer-name))
    (setq winum-ignored-buffers (delete buffer-name winum-ignored-buffers)))

  (defun ctrlwei/lsp-treemacs--set-mode-line-format (buffer title)
    (with-current-buffer buffer
      (setq mode-line-format (list
                              "%e"
                              '(:eval
                                (format winum-format
                                        (winum-get-number-string)))
                              " "
                              title))))
  (advice-add #'lsp-treemacs--set-mode-line-format :override #'ctrlwei/lsp-treemacs--set-mode-line-format))


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; dap-mode
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(with-eval-after-load 'dap-mode
  (require 'dap-java)

  (setq dap-auto-show-output nil)
  (setq dap-internal-terminal #'dap-internal-terminal-vterm)


  (defun ctrlwei/dap-debug (debug-template)
    "Run debug configuration DEBUG-TEMPLATE."
    (interactive)
    (let* ((result (--map (cons (funcall 'cl-first it) it) dap-debug-template-configurations))
           (debug-args (-> (cdr (assoc debug-template result)) cl-rest)))
      (dap-start-debugging (or (-some-> (plist-get debug-args :type)
                                 (gethash dap--debug-providers)
                                 (funcall debug-args))
                               (user-error "Have you loaded the `%s' specific dap package?"
                                           (or (plist-get debug-args :type)
                                               (user-error "%s does not specify :type" debug-args)))))))

  (dap-register-debug-template
   "jd-et"
   (list
    :type "java"
    :name "Debug (Launch) - Integrate Terminal"
    :request "launch"
    :console "integratedTerminal" ; or "internalConsole" or "externalTerminal"
    :mainClass ""
    :args ""
    :cwd nil
    :stopOnEntry :json-false
    :host "localhost"
    :modulePaths (vector)
    :classPaths nil
    :projectName nil
    ))
  (dap-register-debug-template
   "jd"
   (list
    :type "java"
    :name "Debug (Launch)"
    :request "launch"
    :mainClass ""
    :args ""
    :cwd nil
    :program-to-start ""
    :stopOnEntry :json-false
    :host "localhost"
    :modulePaths (vector)
    :classPaths nil
    :projectName nil
    ))
  (dap-register-debug-template
   "jca"
   (list :type "java"
         :request "compile_attach"
         :args ""
         :cwd nil
         :host "localhost"
         :request "launch"
         :modulePaths []
         :classPaths nil
         :name "jca"
         :projectName nil
         :mainClass nil))
  )

(add-hook 'dap-stopped-hook (lambda (arg) (call-interactively #'dap-hydra)))


(provide 'init-lsp)
;;; init-lsp.el ends here
